/**
* Copyright (c) 2012-2016 André Bargull
* Alle Rechte vorbehalten / All Rights Reserved. Use is subject to license terms.
*
* <https://github.com/anba/es6draft>
*/
package com.github.anba.es6draft.util.rules;
import static java.util.Objects.requireNonNull;
import static org.hamcrest.Matchers.anything;
import static org.hamcrest.Matchers.not;
import org.hamcrest.Matcher;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
/**
* Exception handler like {@link TestRule}.
*/
public abstract class ExceptionHandler implements TestRule {
private Matcher<?> matcher;
public ExceptionHandler() {
this(nothing());
}
public ExceptionHandler(Matcher<?> matcher) {
match(matcher);
}
public void match(Matcher<?> matcher) {
this.matcher = requireNonNull(matcher);
}
protected static final Matcher<?> nothing() {
return not(anything());
}
/**
* To be implemented by sub-classes.
*/
protected abstract void handle(Throwable t);
@Override
public Statement apply(final Statement base, final Description description) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
try {
base.evaluate();
} catch (Throwable t) {
if (matcher.matches(t)) {
handle(t);
} else {
throw t;
}
}
}
};
}
}